package com.ikun.kunaicode.service;

import com.ikun.kunaicode.model.dto.chathistory.ChatHistoryQueryRequest;
import com.ikun.kunaicode.model.entity.User;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.ikun.kunaicode.model.entity.ChatHistory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;

/**
 * 对话历史表 服务层。
 *
 * @author cxk
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 添加聊天消息
     *
     * @param appId        应用ID
     * @param message      消息内容
     * @param messageType  消息类型
     * @param userId       用户ID
     * @return 是否成功
     */
    boolean addChatMessage(Long appId, String message, String messageType, Long userId);

    /**
     * 根据应用ID删除聊天历史
     *
     * @param appId 应用ID
     * @return 是否成功
     */
    boolean deleteByAppId(Long appId);

    /**
     * 获取查询包装器
     *
     * @param chatHistoryQueryRequest 查询请求
     * @return 查询包装器
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);

    /**
     * 分页获取应用对话历史记录
     * @param appId 应用ID
     * @param pageSize 每页大小
     * @param lastCreateTime 游标：上一页最后一条对话记录的创建时间
     * @param loginUser
     * @return
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize, LocalDateTime lastCreateTime, User loginUser);

    /**
     * 加载对话历史到内存redis
     * @param appId 应用ID
     * @param chatMemory 会话存储redis
     * @param maxCount 最大加载数量
     * @return 加载数量
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);
}
